#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "../header/Jeu.h"
#include "../header/Carte.h"



void initJeu(Jeu *jeu, const int n)
{
    jeu->jeu=(Carte*)malloc(n*sizeof(Carte));
    jeu->taille=n;
    jeu->nb_points=0;
}

static void setPointsCartes(Jeu *jeu)
{
    int rang,i;
    float point,point_atout;
    for(i=0; i<32; i++)
    {
       rang=jeu->jeu[i].rang;

       switch(rang)
       {
           case 7: point=0; point_atout=0; break; /* 7 */
           case 8: point=0.1; point_atout=0.1; break; /* 8 */
           case 9: point=0.2;  point_atout=14; break; /* 9 */
           case 10: point=10; point_atout=10; break;  /* 10 */
           case 11: point=2;  point_atout=20; break; /* valet */
           case 12: point=3;  point_atout=3; break;  /* dame */
           case 13: point=4;  point_atout=4; break;  /* roi */
           case 14: point=11; point_atout=11; break; /* as */
       }
       jeu->jeu[i].pts=point;
       jeu->jeu[i].pts_atout=point_atout;
       jeu->jeu[i].atout=0;
       jeu->jeu[i].jouee=0;
    }
}

void creerJeu(Jeu *j)
{
    int i;
    for(i=0; i<8;i++)
    {
        j->jeu[i].couleur=PIQUE;
        j->jeu[i].rang=i+7;
    }

    for(i=8; i<16; i++)
    {
        j->jeu[i].couleur=COEUR;
        j->jeu[i].rang=i-1;
    }

    for(i=16; i<24; i++)
    {
        j->jeu[i].couleur=CARREAU;
        j->jeu[i].rang=i-9;
    }

    for(i=24; i<32; i++)
    {
        j->jeu[i].couleur=TREFLE;
        j->jeu[i].rang=i-17;
    }

    setPointsCartes(j);
}

void initMainJoueur(Jeu * mainJoueur)
{
    initJeu(mainJoueur,8);
}

void initPliEnCours(Jeu *pli)
{
    initJeu(pli,4);
}

void initTableauPli(Jeu *tabPli)
{
    initJeu(tabPli,32);
}

void testamentJeu(Jeu *j)
{
    j->taille=0;
    j->nb_points=0;
    free(j->jeu);
}

void melanger(Jeu *j)
{
    int i, indice;
    int compteur=32;
    Carte tampon;

    for(i=0;i<32;i++)
    {
        indice=rand()%compteur;     /*sélectionne au hasard une carte dans le jeu*/
        tampon = j->jeu[indice];    /*sort cette carte du jeu*/
        j->jeu[indice]=j->jeu[compteur-1]; /*la carte sortie est remplacée par la dernière carte du jeu*/
        j->jeu[compteur-1]=tampon;  /*la carte sortie est placée en fin de paquet*/
        compteur--;
    }
}

void couper(Jeu* jeu)
{
    int niveau; niveau = 6;//(rand()%30)+2;
    Jeu tampon; initJeu(&tampon,32);
    int i,j=0;

    for(i=niveau; i<32; i++)
    {
        tampon.jeu[j] = jeu->jeu[i];
        j++;
    }

    for(i=0; i<niveau; i++)
    {
        tampon.jeu[j] = jeu->jeu[i];
        j++;
    }

    for(i=0; i<32; i++) jeu->jeu[i] = tampon.jeu[i];
}

void distribuer(Jeu *j, Jeu *m1, Jeu *m2, Jeu *m3, Jeu *m4)
{
    int i;

    /*1er tour de donne : chaque joueur reçoit d'abord 3 cartes*/
    for (i=0; i<3; i++)
    {
        m1->jeu[i]=j->jeu[i];
        m2->jeu[i]=j->jeu[i+3];
        m3->jeu[i]=j->jeu[i+6];
        m4->jeu[i]=j->jeu[i+9];
    }
    /*2e tour : chaque joueur reçoit 2 cartes*/
    for(i=12; i<14; i++)
    {
        m1->jeu[i-9]=j->jeu[i];
        m2->jeu[i-9]=j->jeu[i+2];
        m3->jeu[i-9]=j->jeu[i+4];
        m4->jeu[i-9]=j->jeu[i+6];
    }

    /*3e tour : chaque joueur reçoit 3 cartes*/
    for(i=20; i<23; i++)
    {
        m1->jeu[i-15]=j->jeu[i];
        m2->jeu[i-15]=j->jeu[i+3];
        m3->jeu[i-15]=j->jeu[i+6];
        m4->jeu[i-15]=j->jeu[i+9];
    }
}

static void tri_insertion(Carte *tab, int n)
{
    Carte *tampon=(Carte*)malloc(8*sizeof(Carte));
    int i, j;
    for(i=0; i<n; i++)
    {
        tampon[i]=tab[i];
        j=i;
        while (j>1 || tab[j-1].rang>tab[i].rang)
        {
            tab[j]=tab[j-1];
            j--;
        }
        tab[j]=tampon[j];
    }
}

/*void trierJeu(Jeu *m)
{
    Carte *tab_coeur;
    Carte *tab_pique;
    Carte *tab_carreau;
    Carte *tab_trefle;

    //On place les cartes de chaque couleur dans quatre tableaux
    int i=0;
    int a=0, b=0, c=0, d=0;
    for(i=0; i<8; i++)
    {
        if(m->jeu[i].couleur==COEUR)
        {
            tab_pique[a]=m->jeu[i];
            a++;
        }
        else if(m->jeu[i].couleur==PIQUE)
        {
            tab_coeur[b]=m->jeu[i];
            b++;
        }
        else if(m->jeu[i].couleur==CARREAU)
        {
            tab_carreau[c]=m->jeu[i];
            c++;
        }
        else if(m->jeu[i].couleur==TREFLE)
        {
            tab_trefle[d]=m->jeu[i];
            d++;
        }
    }
    //Tri des tableaux
    tri_insertion(tab_coeur, a);
    tri_insertion(tab_pique, b);
    tri_insertion(tab_carreau, c);
    tri_insertion(tab_trefle, d);

    //On replace toutes les cartes dans la main
    for(i=0;i<a;i++)
    {
        m->jeu[i]=tab_coeur[i];
    }
    for(i=a;i<b;i++)
    {
        m->jeu[i]=tab_pique[i];
    }
    for(i=b;i<c;i++)
    {
        m->jeu[i]=tab_carreau[i];
    }
    for(i=c;i<d;i++)
    {
        m->jeu[i]=tab_trefle[i];
    }
}*/
